정규화

개요

데이터를 결정하는 결정자에 의해 함수적 종속을 일반 속성 의존자로 하여 이상현상을 제거하는 것이다.
결정자에 의해 동일한 의미를 가진 일반 속성이 하나의 테이블로 집약되므로 데이터 용량이 최소화된다.

말이 벌써 어렵다.
간단하게는 데이터의 중복이나 복잡성을 줄이기 위해 테이블을 쪼개는 과정이라고 정리할 수 있겠다.
자세한 용어는 아래에서 설명한다.

용어

정규화에 관련한 용어는 생소하므로 숙지하는 것이 좋다.

장점

상호 종속성이 강한 데이터 요소들을 분리해 높은 응집도 & 낮은 결합도 원칙에 충실해진다.
이 원칙을 지키면 유연성이 높아지고, 재활용성도 올라간다.
여기에 중복이 최소화되니 품질이 확보되며 저장공간은 절약된다.

데이터베이스를 사용할 때 우리는 DML을 사용한다.
즉 조회, 입력, 수정, 삭제가 일어난다.
정규화는 다른 동작에 대해서는 전부 성능 향상을 일으킨다.
그러나 조회에 대해서는 처리 조건에 따라 성능을 향상시킬 수도, 저하시킬 수도 있다.
거의 필연적으로 조인을 하게 되는 경우가 발생하기 때문이다.
하지만 인덱스를 통해 조인 연산을 효율적으로 진행할 수 있어 성능 단점이 거의 없게 할 수도 있다.
또 정규화로 인한 조인 연산은 적은 용량의 테이블을 먼저 읽어 수행하는 등의 방법으로 성능을 유리하게 할 수도 있다.
게다가 정규화가 잘 됐을 때는 오히려 인덱스를 테이블 당 정확하게 하나씩만 둘 수 있게 되기에, 더욱 좋다고도 할 수 있다.

그러나 반정규화에서 보겠지만, 오히려 불리한 경우도 발생은 할 수 있다.

정규화 이론

1,2,3차와 보이스-코드, 4차, 5차까지도 있다.
4차는 다치 종속, 5차는 조인에 대한 이상현상을 없앤다.
나머지는 함수 종속성에 근거하여 정규화를 한다.
이 각각을 알아보자.

참고로 이 정규화들은 막상 ERD 짜다 보면 자연스레 하게 되는 경우가 많다.

1차 정규화

한 속성에 여러 값이 있거나, 같은 유형의 속성이 여러 개일 때 해당 속성을 분리한다.
속성의 원자성이 확보된다.
Pasted image 20241107195203.png
이러한 테이블이 보자면, 전화 번호에 두가지 값이 들어가고 있다.
이걸 해결하는 방법은 뭐가 있을까?
Pasted image 20241107195336.png
이런 방법이 가능하다.
아니면 행을 하나 더 늘리는 방법도 있다.
그러나 이 두 방법은 제1 정규형에 위배된다.
엄밀한 정규형에서는 null 값이 있으면 안 되고, 동일한 의미를 가진 칼럼이 있기 때문이다.
또한 기본키까지 있어야만 하기에 더더욱 불가능한 일이다.
Pasted image 20241107195514.png
이것이 바로 제1 정규형을 만족하는 테이블이다.

제 1정규형을 통해 확보되는 것은 원자성이다.
원자성은 더 작은 값으로 쪼개지지 않는 속성을 말한다.
근데 이 정의에 대해서는 사실 학자마다 의견이 분분하다.

2차 정규화

주식별자에 완전 함수 종속되지 않는 속성을 분리한다.
부분 종속 속성인 속성을 분리한다.

제 1정규형을 만족하는 것이 전제된다.
그 상태에서 모든 기본키가 아닌 칼럼은 기본키에 종속되어야 한다.
종속적이지 않거나 일부만 종속된다면 분리되어야만 한다.
Pasted image 20241107200658.png
위의 테이블에서 기본키는 종업원과 기술을 합쳐야 한다.
그런데 근무지는 종업원에만 영향을 받게 된다.
이것은 기본키에 부분 종속이라는 것을 의미하고, 이를 제거하는 게 2차 정규화이다.
Pasted image 20241107200813.png
이런 식으로 말이다.

제2 정규형은 갱신 이상을 상당 수 해결한다.
종업원의 근무지를 변경할 때, 여러 개의 행을 변경해야 하는 어려움이 생긴다.
그러나 무조건 없애지는 못하는데, 이것은 3차 정규화를 통해 해결된다.

3차 정규화

일단 이것도 제2 정규형에서 실행된다.
일반 속성끼리 함수 종속이 발생한 속성을 분리한다.
이행적 종속 속성을 분리한다.
이행적 함수 종속이란 기능적 종속을 의미한다.
X ⟶{isplaystyle ongrightarrow } Y 이고 Y ⟶{isplaystyle ongrightarrow } Z 에 의해서 X ⟶{isplaystyle ongrightarrow } Z (X가 Z를 결정한다)
이런 상태의 한 테이블에 있다면 이행적 함수 종속 상태인 것이다.
Pasted image 20241107201300.png
여기에서 기본키는 대회와 연도이다.
이 기본키는 우승자의 결정자이다.
그러나 우승자 생년 월일은 우승자에 종속되고 있다.
이렇게 삼단 논법으로 제2 정규형을 만족하는 상태라면, 나중에 갱신 이상이 발생할 수 있다.
Pasted image 20241107201440.png
이렇게 만들면 제3 정규형이 된다.

계속 보면 알겠지만, 정규화라는 것은 각 컬럼의 의미를 보고 파악해야 한다.
구조만으로 파악할 수 있는 것은 아니란 것을 명심할 필요가 있다.
물론 제1 정규형은 보고도 판단할 수 있긴 하다.

보이스-코드 정규화

결정자 안에 함수 종속을 가진 주식별자 속성을 분리한다.
다시 말하자면, 결정자가 되는 녀석들을 전부 후보키로 만든다.
후보키는 최소성과 유일성을 만족해야 한다.

이 정규화부터는 나중에 다루기로 한다.

4차 정규화

다치 종속을 별도의 엔터티로 분리한다.

여기에서부터는 사실 별다른 이점이 그다지 존재하지 않아 현실에서 이용하지 않는다고 한다.

5차 정규화

결합 종속을 2개 이상의 엔터티로 분리한다.

참고